#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Test the 'szamok' module. """

import unittest

from szamok import DASH_LIMIT
from szamok import convert_digit_to_word
from szamok import convert_number_to_word
from szamok import convert_triplet_to_word


def run_doc_tests():
    """ Execute doc tests. """
    import doctest
    import szamok
    doctest.testmod(szamok, verbose=True)


def run_unit_tests():
    """ Execute unit tests. """
    suite = unittest.TestLoader().loadTestsFromTestCase(TestFunctions)
    unittest.TextTestRunner(verbosity=10).run(suite)


def run_tests():
    """ Run doc- and unit tests. """
    run_doc_tests()
    run_unit_tests()


class TestFunctions(unittest.TestCase):

    def test_digit_to_word_conversion(self):
        my_dict = {(0, 0): "nulla",

                   (1, 0): "",
                   (1, 1): "egy",
                   (1, 2): "kettő",
                   (1, 9): "kilenc",

                   (2, 10): "tíz",
                   (2, 1): "tizen",
                   (2, 20): "húsz",
                   (2, 2): "huszon",
                   (2, 9): "kilencven",

                   (3, 0): "száz",
                   (4, 0): "ezer",
                   (7, 0): "millió",
                   (10, 0): "milliárd",
                   (13, 0): "billió",
                   (16, 0): "billiárd",
                   (19, 0): "trillió",
                   (22, 0): "trilliárd"}

        for (key, value) in my_dict.items():
            (position, digit) = key
            word = convert_digit_to_word(position, digit)
            self.assertEqual(word, value, "Wrong digit conversion: %s != %s" %
                             (word, value))

    def test_triplet_to_word_conversion(self):
        my_dict = {(0, 1): "",
                   (1, 1): "egy",
                   (9, 1): "kilenc",
                   (10, 1): "tíz",
                   (11, 1): "tizenegy",
                   (19, 1): "tizenkilenc",
                   (20, 1): "húsz",
                   (21, 1): "huszonegy",
                   (29, 1): "huszonkilenc",
                   (30, 1): "harminc",
                   (31, 1): "harmincegy",
                   (40, 1): "negyven",
                   (45, 1): "negyvenöt",
                   (99, 1): "kilencvenkilenc",
                   (100, 1): "egyszáz",
                   (101, 1): "egyszázegy",
                   (110, 1): "egyszáztíz",
                   (111, 1): "egyszáztizenegy",
                   (119, 1): "egyszáztizenkilenc",
                   (120, 1): "egyszázhúsz",
                   (121, 1): "egyszázhuszonegy",
                   (123, 1): "egyszázhuszonhárom",
                   (130, 1): "egyszázharminc",
                   (170, 1): "egyszázhetven",
                   (200, 1): "kettőszáz",
                   (300, 1): "háromszáz",
                   (900, 1): "kilencszáz",
                   (901, 1): "kilencszázegy",
                   (999, 1): "kilencszázkilencvenkilenc",

                   (1, 4): "egyezer",
                   (2, 4): "kettőezer-",
                   (9, 4): "kilencezer-",
                   (10, 4): "tízezer-",
                   (11, 4): "tizenegyezer-",
                   (20, 4): "húszezer-",
                   (21, 4): "huszonegyezer-",
                   (22, 4): "huszonkettőezer-",
                   (30, 4): "harmincezer-",
                   (31, 4): "harmincegyezer-",
                   (100, 4): "egyszázezer-",
                   (101, 4): "egyszázegyezer-",
                   (110, 4): "egyszáztízezer-",
                   (111, 4): "egyszáztizenegyezer-",
                   (999, 4): "kilencszázkilencvenkilencezer-",

                   (1, 7): "egymillió-",
                   (2, 7): "kettőmillió-",
                   (9, 7): "kilencmillió-",
                   (11, 7): "tizenegymillió-",
                   (12, 7): "tizenkettőmillió-",
                   (20, 7): "húszmillió-",
                   (21, 7): "huszonegymillió-",
                   (30, 7): "harmincmillió-",
                   (31, 7): "harmincegymillió-",
                   (100, 7): "egyszázmillió-",
                   (101, 7): "egyszázegymillió-",
                   (110, 7): "egyszáztízmillió-",
                   (111, 7): "egyszáztizenegymillió-",
                   (120, 7): "egyszázhúszmillió-",
                   (121, 7): "egyszázhuszonegymillió-",
                   (900, 7): "kilencszázmillió-",
                   (999, 7): "kilencszázkilencvenkilencmillió-",

                   (1, 10): "egymilliárd-",
                   (2, 10): "kettőmilliárd-",
                   (9, 10): "kilencmilliárd-",
                   (11, 10): "tizenegymilliárd-",
                   (12, 10): "tizenkettőmilliárd-",
                   (20, 10): "húszmilliárd-",
                   (21, 10): "huszonegymilliárd-",
                   (30, 10): "harmincmilliárd-",
                   (31, 10): "harmincegymilliárd-",
                   (100, 10): "egyszázmilliárd-",
                   (101, 10): "egyszázegymilliárd-",
                   (110, 10): "egyszáztízmilliárd-",
                   (111, 10): "egyszáztizenegymilliárd-",
                   (120, 10): "egyszázhúszmilliárd-",
                   (121, 10): "egyszázhuszonegymilliárd-",
                   (900, 10): "kilencszázmilliárd-",
                   (999, 10): "kilencszázkilencvenkilencmilliárd-",

                   (1, 13): "egybillió-",
                   (2, 13): "kettőbillió-",
                   (9, 13): "kilencbillió-",
                   (11, 13): "tizenegybillió-",
                   (12, 13): "tizenkettőbillió-",
                   (20, 13): "húszbillió-",
                   (21, 13): "huszonegybillió-",
                   (30, 13): "harmincbillió-",
                   (31, 13): "harmincegybillió-",
                   (100, 13): "egyszázbillió-",
                   (101, 13): "egyszázegybillió-",
                   (110, 13): "egyszáztízbillió-",
                   (111, 13): "egyszáztizenegybillió-",
                   (120, 13): "egyszázhúszbillió-",
                   (121, 13): "egyszázhuszonegybillió-",
                   (900, 13): "kilencszázbillió-",
                   (999, 13): "kilencszázkilencvenkilencbillió-",
                   }

        for (key, value) in my_dict.items():
            (number, position) = key
            ### az egybeírások miatt tudni kell...
            if number * 10 ** (position - 1) < DASH_LIMIT:
                smaller_than_dash_limit = True
            else:
                smaller_than_dash_limit = False
            word = convert_triplet_to_word(number, position,
                                           smaller_than_dash_limit)
            self.assertEqual(word, value,
                             "Wrong triplet conversion: %s != %s" %
                             (word, value))

    def test_number_to_word_conversion(self):
        my_dict = {-123: "mínusz egyszázhuszonhárom",
                   -1: "mínusz egy",
                   0: "nulla",
                   1: "egy",
                   7: "hét",
                   9: "kilenc",
                   10: "tíz",
                   11: "tizenegy",
                   20: "húsz",
                   21: "huszonegy",
                   30: "harminc",
                   100: "egyszáz",
                   1000: "egyezer",
                   1001: "egyezeregy",
                   1010: "egyezertíz",
                   1011: "egyezertizenegy",
                   1111: "egyezeregyszáztizenegy",
                   1120: "egyezeregyszázhúsz",
                   1121: "egyezeregyszázhuszonegy",
                   1978: "egyezerkilencszázhetvennyolc",
                   2000: "kettőezer",
                   2008: "kettőezer-nyolc",
                   2010: "kettőezer-tíz",
                   2012: "kettőezer-tizenkettő",
                   2020: "kettőezer-húsz",
                   2021: "kettőezer-huszonegy",
                   3000: "háromezer",
                   10000: "tízezer",
                   10001: "tízezer-egy",
                   11001: "tizenegyezer-egy",
                   11111: "tizenegyezer-egyszáztizenegy",
                   20000: "húszezer",
                   20001: "húszezer-egy",
                   22222: "huszonkettőezer-kettőszázhuszonkettő",
                   100000: "egyszázezer",
                   100001: "egyszázezer-egy",
                   100010: "egyszázezer-tíz",
                   100011: "egyszázezer-tizenegy",
                   100100: "egyszázezer-egyszáz",
                   100101: "egyszázezer-egyszázegy",
                   100110: "egyszázezer-egyszáztíz",
                   100111: "egyszázezer-egyszáztizenegy",
                   101000: "egyszázegyezer",
                   101001: "egyszázegyezer-egy",
                   101010: "egyszázegyezer-tíz",
                   101011: "egyszázegyezer-tizenegy",
                   101100: "egyszázegyezer-egyszáz",
                   101101: "egyszázegyezer-egyszázegy",
                   101110: "egyszázegyezer-egyszáztíz",
                   101111: "egyszázegyezer-egyszáztizenegy",
                   110000: "egyszáztízezer",
                   110001: "egyszáztízezer-egy",
                   200000: "kettőszázezer",
                   1000000: "egymillió",
                   1000001: "egymillió-egy",
                   1000020: "egymillió-húsz",
                   1001000: "egymillió-egyezer",
                   1001001: "egymillió-egyezer-egy",
                   1002000: "egymillió-kettőezer",
                   1002001: "egymillió-kettőezer-egy",
                   2000000: "kettőmillió",
                   2000010: "kettőmillió-tíz",
                   2000030: "kettőmillió-harminc",
                   20000040: "húszmillió-negyven",
                   25252525: "huszonötmillió-kettőszázötvenkettőezer-"
                             "ötszázhuszonöt",
                   303303030: "háromszázhárommillió-háromszázháromezer-"
                              "harminc",
                   1000000000: "egymilliárd",
                   1000000001: "egymilliárd-egy",
                   1001001001: "egymilliárd-egymillió-egyezer-egy",
                   1001002001: "egymilliárd-egymillió-kettőezer-egy",
                   1000000000000: "egybillió",
                   1000000000001: "egybillió-egy",
                   1000000000002: "egybillió-kettő",
                   1000000001000: "egybillió-egyezer",
                   1000000001001: "egybillió-egyezer-egy",
                   1000000001002: "egybillió-egyezer-kettő",
                   1000000002002: "egybillió-kettőezer-kettő",
                   }

        for (key, value) in my_dict.items():
            word = convert_number_to_word(key)
            self.assertEqual(word, value, "Wrong number conversion: %s != %s" %
                             (word, value))

if __name__ == '__main__':
    run_tests()
